package day1_array;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @Author: yuisama
 * @Date: 2021/8/4 21:12
 * @Description:多数元素
 * 给定一个大小为 n 的数组，找到其中的多数元素。多数元素是指在数组中出现次数 大于⌊n/2⌋的元素。
 * 你可以假设数组是非空的，并且给定的数组总是存在多数元素。
 * 示例1：
 * 输入：[3,2,3]
 * 输出：3
 * 示例2：
 * 输入：[2,2,1,1,1,2,2]
 * 输出：2
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/majority-element
 */
public class num169_majorityElement {
    /**
     * 哈希表法
     * 哈希表存储出现元素以及次数，空间复杂度以及时间复杂度O(n)
     * @param nums
     * @return
     */
    public int majorityElement1(int[] nums) {
        int size = nums.length;
        int majorityElement = 0;
        Map<Integer,Integer> numTimes = new HashMap<>();
        for (int i : nums) {
            if (numTimes.containsKey(i)) {
                numTimes.put(i,numTimes.get(i)+1);
            }else {
                numTimes.put(i,1);
            }
        }
        // 遍历哈希表，找到出现次数大于2/n的数
        Iterator<Map.Entry<Integer,Integer>> iterator =
                numTimes.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer,Integer> entry =
                    iterator.next();
            if (entry.getValue() > 2/size) {
                majorityElement  = entry.getKey();
            }
        }
        return majorityElement;
    }

    /**
     * 排序法
     * 将数组排序后，数组n/2的元素一定是众数
     */
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}
